Skip to main content

第18章 MySQL分区

第18章 MySQL分区

一、分区的好处

  • 当一个表里面的数据太多了的时候,占用的空间太大,可能就接近磁盘的存储空间,这时候就需要分区,把表的数据拆开(分区),然后让不同分区的数据存储到不同的磁盘上面
  • 提高性能:由于满足给定WHERE子句的数据只能存储在一个或多个分区上,这将自动从搜索中排除任何剩余分区,因此某些查询可以得到极大的优化。
  • 失去有用性的数据通常可以通过删除仅包含该数据的分区(或多个分区)轻松地从分区表中删除。相反,在某些情况下,通过添加一个或多个新分区来专门存储数据,可以大大简化添加新数据的过程。
  • 此外,Mysql不支持垂直分区,仅仅支持水平分区,因为垂直分区不太符合mysql观念

二、范围Range分区

  • 指定了某一列或者某几列,根据他们值的范围,然后来分区
  • 区域应该是连续而且不能重复的,通常都是用的LESS THEN,比如<0的分个区,<50的分区,<MAX_VALUE分区。
  • 不允许用float浮点数,因为比较的时候不好处理,所以禁止!
  • 如果制定了多列,比如a、b、c,能不能把a的列做一个平方或者函数计算一下处理?不行!!不接受表达式
  • 多列比较的是向量,比如要比较(a,b,c)(d,e,f),就比较a和d,比较出来小于的话就小于,比较不出来就是比较b和e,然后同理比较c和f

三、List分区

  • 离散的值,这些值都是固定的,比如交大有闵行、七宝校区等等就可以根据这些校区的值来确定分区
  • 定义某个列的取值范围,根据取值范围来分区
  • 不同于Switch语句里面的default,采用list分区假如插入一个不符合分区list的元组,系统会直接报错。如果采用Ignore标识符,插入多个行,有的合法有的不合法,系统会插入合法的,丢弃不合法。

四、Hash分区

  • 根据用户指定的表达式来处理,比如把学号的数字模3,然后决定是哪一台服务器存储,一般在非负的值上面处理。
  • 特殊情况:线性哈希

五、Key散列

  • Mysql自动根据主键散列

六、问题处理

  • NULL处理:如果遇到了NULL数值,这种插入的东西会被放到最小的一个分区里面(范围最低的一个分区)而对于List分区,允许in Null专门创建一个分区;对于Hash分区,null都会被当做0然后送到hash函数里面
  • 调整分区(重新组织分区):比较耗时间,调整涉及到整个表格
  • 删除分区:如果用的分区规则全是小于,那么删除一个分区就会导致原来存储的数据删除,但是后面新的输入插入进来的时候就会进入正确的分区。
  • 特别提示:不允许drop 分区(通过Hash分区或者key散列的)!一旦drop,那么整个分区的数量就发生变化,那么假如之前是取模运算,现在分区数量改变,所有的存储都要发生大变化!除非重新调整,而且不是用reorginaze,用的语法是coalesce!但是追加可以直接进行!具体原因没有将,有自己的实现!